#include <iostream>

/*
在这个文件当中，我们需要实现一个素数检测函数，然后在主函数当中调用。
函数只要实现一次，即可被无限次的调用
主函数只需要直到what it does，不需要直到how it does
*/

/*
素数（或质数）是指在大于 1 的自然数中，除了 1 和它本身以外不再有其他因数的自然数。
这个素数检测器需要传入用户输入的参数，然后返回yes or no，可以是一个布尔值

函数的返回值是一个布尔值，然后接收的参数是一个int类型的参数，函数需要验证用户输入的参数是否大于1，然后是否是素数
*/
bool prime_checker_bool(int user_input)
{
    // 判断输入是否大于1，是否满足素数的最基础的要求
    if(user_input > 1)
    {   
        // 这里的判断条件是存在问题的，因为任何数除以其1都是其本身，所以只要是大于1的参数永远会返回true
        //if(user_input / 1 != user_input || user_input / user_input != 1)
        // 首先偶数肯定不是素数，但2是唯一的偶数素数，需要单独判断这个边界条件
        if(user_input == 2)
        {
            return true;
        }
        // 将其他的偶数全部都排除，因为除了2以外的偶数全都不是素数
        else if(user_input % 2 == 0)     // %是取余数的意思，如果余数为0，说明输入的数字可以被2整除，那么就说明不是素数
        {
            return false;
        }
        // 排除完2、和其他的偶数之后，剩下的数字都是奇数，所以需要判断奇数是否是素数
        else if(user_input % 2 != 0)
        {
            // 判断奇数是否是素数，需要判断这个奇数是否可以被其他奇数整除
            // 循环从3开始，因为2已经排除，然后每次循环的步长为2，因为奇数除以2的余数为1，所以每次循环的步长为2
            // 循环的结束条件是i < user_input，因为如果i等于user_input，那么就说明这个奇数可以被自己整除，那么就说明不是素数
            // 如果i等于user_input，那么就说明这个奇数可以被自己整除，那么就说明不是素数
            for(int i = 2; i < user_input; i += 2)
            {
                if(user_input % i == 0)
                {
                    return false;
                }
                else
                {
                    return true;
                }
            }
        }
        else 
        {
            return true;
        }
    }
    // 如果不满足，则直接返回false
    else
    {
        return false;
    }
}


/*
实际上也可以让函数返回字符串，这样体现的信息更多，更方便
*/
// std::string prime_checker_string(int user_input)
// {
//     // 判断输入是否大于1，是否满足素数的最基础的要求
//     if(user_input > 1)
//     {   
//         if(user_input / 1 != user_input || user_input / user_input != 1)
//         {
//             return "不是素数";
//         }
//         else 
//         {
//             return "是素数";
//         }
//     }
//     // 如果不满足，则直接返回false
//     else
//     {
//         return "输入的数字需要大于1！";
//     }
// }

int main()
{
    std::cout << "请输入参数来判断是否是素数" << std::endl;
    int user_input;
    std::cin >> user_input;

    if(prime_checker_bool(user_input))
    {
        std::cout << "是素数" << std::endl;
    }
    else 
    {
        std::cout << "不是素数" << std::endl;
    }

}